package com.example.utils;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class ExcelUtil {

    public static List<List<String>> getCellValue(MultipartFile file) throws IOException {
        // 用于存储最终解析得到的 Excel 数据，是一个二维列表
        List<List<String>> result = new ArrayList<>();
        // 检查上传的文件是否为空
        if (!file.isEmpty()) {
            try (
                    // 从 MultipartFile 中获取输入流，用于读取文件内容
                    InputStream inputStream = file.getInputStream()
            ) {
                // 创建一个 XSSFWorkbook 对象，用于处理 .xlsx 格式的 Excel 文件
                Workbook workbook = new XSSFWorkbook(inputStream);
                // 获取工作簿中的第一个工作表
                Sheet sheet = workbook.getSheetAt(0);
                // 遍历工作表中的每一行
                for (Row row : sheet) {
                    // 用于存储当前行的数据
                    List<String> rowData = new ArrayList<>();
                    // 遍历当前行中的每一个单元格
                    for (Cell cell : row) {
                        // 获取当前单元格的类型
                        CellType cellType = cell.getCellType();
                        // 根据单元格的类型进行不同的处理
                        switch (cellType) {
                            // 如果单元格类型是字符串
                            case STRING:
                                // 将单元格中的字符串值添加到当前行的数据列表中
                                rowData.add(cell.getStringCellValue());
                                break;
                            // 如果单元格类型是数字
                            case NUMERIC:
                                // 检查单元格是否是日期格式
                                if (DateUtil.isCellDateFormatted(cell)) {
                                    // 如果是日期格式，将日期转换为字符串并添加到当前行的数据列表中
                                    rowData.add(cell.getDateCellValue().toString());
                                } else {
                                    // 如果不是日期格式，将数字转换为字符串并添加到当前行的数据列表中
                                    rowData.add(String.valueOf(cell.getNumericCellValue()));
                                }
                                break;
                            // 如果单元格类型是布尔值
                            case BOOLEAN:
                                // 将布尔值转换为字符串并添加到当前行的数据列表中
                                rowData.add(String.valueOf(cell.getBooleanCellValue()));
                                break;
                            // 如果单元格类型是公式
                            case FORMULA:
                                // 将公式添加到当前行的数据列表中
                                rowData.add(cell.getCellFormula());
                                break;
                            // 其他类型
                            default:
                                // 添加空字符串到当前行的数据列表中
                                rowData.add("");
                        }
                    }
                    // 将当前行的数据添加到最终结果列表中
                    result.add(rowData);
                }
                // 关闭工作簿，释放资源
                workbook.close();
            }
        }
        // 返回解析得到的 Excel 数据
        return result;
    }
}
